#include "verifycodewidget.h"

#include <QDateTime>
#include <QPainter>
#include <QPen>

VerifyCodeWidget::VerifyCodeWidget(QWidget *parent)
    : QWidget{parent}
{
    // 使用当前时间作为种子
    randomGenerator.seed(QDateTime::currentMSecsSinceEpoch());
    verifyCode = generateVerifyCode();
}

///
/// 生成的是 "随机的大写字母", 类似的思路, 也可以生成小写字母和阿拉伯数字
/// 不混合生成数字字母的理由：有些字符, 会混淆. 比如 O o 0; 再比如 I 1 l;
///
QString VerifyCodeWidget::generateVerifyCode()
{
    QString code;

    for (int i = 0; i < 4; ++i)
    {
        // 每次循环生成一个字符.
        // int init = 'A';
        // init += randomGenerator.generate() % 26;
        // code += static_cast<QChar>(init);
        code += safeChars.at(randomGenerator.generate() % safeChars.length());
    }

    return code;
}

///
/// 重新生成验证码字符串，刷新界面
///
void VerifyCodeWidget::refreshVerifyCode()
{
    verifyCode = generateVerifyCode();

    // 通过 update 就可以起到 "刷新界面" , 本身就是触发 paintEvent
    this->update();
}

///
/// 忽略大小写，验证，验证码
///
bool VerifyCodeWidget::checkVerifyCode(const QString &verifyCode)
{
    // 忽略大小写：Qt::CaseInsensitive
    return this->verifyCode.compare(verifyCode, Qt::CaseInsensitive) == 0;
}

void VerifyCodeWidget::paintEvent(QPaintEvent *event)
{
    (void) event;

    // 绘制区域宽高
    const int width = 180;
    const int height = 80;

    // 设置画家、画笔
    QPainter painter(this);
    QPen pen;
    QFont font("楷体",25,QFont::Bold,true);
    painter.setFont(font);

    // 画点: 添加随机噪点
    for(int i = 0; i < 100; i++)
    {
        pen = QPen(QColor(randomGenerator.generate() % 256, randomGenerator.generate() % 256, randomGenerator.generate() % 256)); // 随机画笔颜色
        painter.setPen(pen);
        painter.drawPoint(randomGenerator.generate() % width, randomGenerator.generate() % height);
    }

    // 画线: 添加随机干扰线
    for(int i = 0; i < 5; i++)
    {
        pen = QPen(QColor(randomGenerator.generate() % 256, randomGenerator.generate() % 256, randomGenerator.generate() % 256)); // 随机画笔颜色
        painter.setPen(pen);
        painter.drawLine(randomGenerator.generate() % width, randomGenerator.generate() % height, /* 起点 */
                         randomGenerator.generate() % width, randomGenerator.generate() % height); /* 终点 */
    }

    //
    // 绘制验证码
    // 规则: 1. 水平间隔20px; 2. 垂直浮动10px; 3. 居中绘制
    //
    for(int i = 0; i < verifyCode.size(); i++)
    {
        pen = QPen(QColor(randomGenerator.generate() % 255, randomGenerator.generate() % 255, randomGenerator.generate() % 255)); // 随机画笔颜色
        painter.setPen(pen);
        painter.drawText(5+20*i, randomGenerator.generate() % 10, 30, 30, Qt::AlignCenter, QString(verifyCode[i]));
    }

}

void VerifyCodeWidget::mousePressEvent(QMouseEvent *event)
{
    (void) event;

    this->refreshVerifyCode();
}
